import os
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QPushButton, QLabel, \
    QListWidget, QAbstractItemView, QTextEdit, QFileDialog, QListWidgetItem
from thread import Thread_do

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # '''
        # 界面介绍：
        # 界面使用box布局，一个垂直QVBox布局，包含个多行水平QHBox布局：
        # 第1行：一个显示原始图片文件所在位置的文本框，一个打开文件夹选择对话框按钮
        # 第2行：左侧为一个显示指定文件夹内图片文件名的列表框，下面为一个删除按钮，右侧为一个图片，用于预览当前选中的图片文件
        # 第3行：一个文本框，用于显示处理进度和处理信息。
        # 第4行：一个居中的开始提取按钮
        # '''

        vbox = QVBoxLayout()
        hbox_line1 = QHBoxLayout()
        hbox_line2 = QHBoxLayout()
        hbox_line3 = QHBoxLayout()
        hbox_line4 = QHBoxLayout()
        hbox_line5 = QHBoxLayout()

        # 第一行
        # 一个标签，一个文件框，一个打开对话框按钮
        self.txt_src_path = QLineEdit("请选择目录")
        self.txt_src_path.setReadOnly(True)
        btn_open_src_path = QPushButton("...")
        btn_open_src_path.clicked.connect(self.show_dialog_src)
        hbox_line1.addWidget(QLabel('图片所在目录:'))
        hbox_line1.addWidget(self.txt_src_path)
        hbox_line1.addWidget(btn_open_src_path)

        # 第二行
        # 一个垂直布局（上面为一个图片文件列表，下面为删除按钮）一个用于显示当前选中的图片
        vbox_s1 = QVBoxLayout()
        self.pic_listbox = QListWidget(self)
        self.pic_listbox.setMaximumHeight(300)
        self.pic_listbox.setMinimumHeight(300)
        # 使列表框中的元素可拖动并设置拖动模式
        self.pic_listbox.setAcceptDrops(True)
        self.pic_listbox.setDragDropMode(QAbstractItemView.InternalMove)
        # 绑定列表框中列表项点击的事件（更新预览图片的显示内容）
        self.pic_listbox.itemClicked.connect(self.list_item_click)
        btn_del = QPushButton("移除")
        btn_del.clicked.connect(self.delete_list_item)

        vbox_s1.addWidget(self.pic_listbox)
        vbox_s1.addWidget(btn_del)
        hbox_line2.addLayout(vbox_s1)

        # 添加一个图片，用于显示选中的图片
        self.lbl_image = QLabel(self)
        # 固定预览图片的大小，可以进一步细化为根据宽度自动适应图片比例
        self.lbl_image.setMinimumSize(300, 400)
        self.lbl_image.setMaximumSize(300, 400)
        self.lbl_image.setText("未选中图片")
        self.lbl_image.setScaledContents(True)
        hbox_line2.addWidget(self.lbl_image)

        #第3行，处理信息文本框
        self.txt_info = QTextEdit()
        hbox_line3.addWidget(self.txt_info)

        # 第4行，立即提取按钮
        self.btn_do = QPushButton("do it")
        hbox_line4.addWidget(self.btn_do)
        self.btn_do.clicked.connect(self.process_pic)

        # 把几个水平布局加入到垂直布局器中
        vbox.addLayout(hbox_line1)
        vbox.addLayout(hbox_line2)
        vbox.addLayout(hbox_line3)
        vbox.addLayout(hbox_line4)

        self.setLayout(vbox)

        # 设置窗口大小（1024*840）及初始化位置（100,100）
        self.setGeometry(100, 100, 1024, 720)
        self.setWindowTitle("ocr")

        self.show()

    # 选择源文件夹对话框
    def show_dialog_src(self):
        folder_path = QFileDialog.getExistingDirectory(self, "select image folder")
        self.txt_src_path.setText(folder_path)
        self.load_pic(folder_path)
        item_count = self.pic_listbox.count()

    # 列表框中列表项的点击事件，在预览图片中显示该文件
    def list_item_click(self):
        sel_items = self.pic_listbox.selectedItems()
        sel_file = os.path.join(self.txt_src_path.text(), sel_items[0].text())
        pixmap = QPixmap(sel_file)
        self.lbl_image.setPixmap(pixmap)
        self.lbl_image.setScaledContents(True)

    # 删除列表中某一项的事件
    def delete_list_item(self):
        current = self.pic_listbox.currentRow()
        if current != -1:
            item = self.pic_listbox.takeItem(current)
            del item
            self.pic_listbox.setCurrentRow(-1)
            self.lbl_image.clear()
            self.lbl_image.setText("unselect file")

    # 处理按钮的点击事件
    def process_pic(self):
        path = self.txt_src_path.text()
        # list_pic = []
        # for i in range(self.pic_listbox.count()):
        #     file_name = self.pic_listbox.item(i).text()
        #     list_pic.append(file_name)

        sel_items = self.pic_listbox.selectedItems()
        image_path = os.path.join(self.txt_src_path.text(), sel_items[0].text())

        self.btn_do.setEnabled(False)
        self.btn_do.setText("doing")
        # 定义线程实例并将参数传入
        # self.thread_do = Thread_do(path, list_pic)
        self.thread_do = Thread_do(image_path)
        # 信号连接，如果收到信号，就执行对应的函数
        self.thread_do._signal.connect(self.update_txt_info)
        # 启动线程实例
        self.thread_do.start()

    def update_txt_info(self, _info):
        if _info == 'finished':
            self.btn_do.setEnabled(True)
            self.btn_do.setText("start")
        else:
            self.txt_info.append(_info)

    # 把指定文件夹中的图片加载到列表框中的事件
    def load_pic(self, _path):
        self.pic_listbox.clear()
        for file in os.listdir(_path):
            if file.endswith('.jpg') or file.endswith(".png") or file.endswith(".bmp") \
                or file.endswith(".JPG") or file.endswith(".PNG") or file.endswith(".BMP"):
                self.pic_listbox.addItem(QListWidgetItem(file))

